package com.tnl.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;

public class RadomUtils {
	public String valueBeforeMD5 = "";
	public String valueAfterMD5 = "";
	private static Random myRand;
	private static SecureRandom mySecureRand = new SecureRandom();
	private static String s_id;
	private static final int PAD_BELOW = 16;
	private static final int TWO_BYTES = 255;
    public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String numberChar = "0123456789";
    private static int i=0;//初始值

	static {
		long secureInitializer = mySecureRand.nextLong();
		myRand = new Random(secureInitializer);
		try {
			s_id = InetAddress.getLocalHost().toString();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}

	public RadomUtils() {
		getRandomGUID(false);
	}

	public RadomUtils(boolean secure) {
		getRandomGUID(secure);
	}

	private void getRandomGUID(boolean secure) {
		MessageDigest md5 = null;
		StringBuffer sbValueBeforeMD5 = new StringBuffer(128);
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		try {
			long time = System.currentTimeMillis();
			long rand = 0L;
			if (secure) {
				rand = mySecureRand.nextLong();
			} else {
				rand = myRand.nextLong();
			}
			sbValueBeforeMD5.append(s_id);
			sbValueBeforeMD5.append(":");
			sbValueBeforeMD5.append(Long.toString(time));
			sbValueBeforeMD5.append(":");
			sbValueBeforeMD5.append(Long.toString(rand));

			this.valueBeforeMD5 = sbValueBeforeMD5.toString();
			md5.update(this.valueBeforeMD5.getBytes());

			byte[] array = md5.digest();
			StringBuffer sb = new StringBuffer(32);
			for (int j = 0; j < array.length; j++) {
				int b = array[j] & 0xFF;
				if (b < 16) {
					sb.append('0');
				}
				sb.append(Integer.toHexString(b));
			}
			this.valueAfterMD5 = sb.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String toString() {
		String raw = this.valueAfterMD5.toUpperCase();
		StringBuffer sb = new StringBuffer(64);
		sb.append(raw.substring(0, 8));
		sb.append("-");
		sb.append(raw.substring(8, 12));
		sb.append("-");
		sb.append(raw.substring(12, 16));
		sb.append("-");
		sb.append(raw.substring(16, 20));
		sb.append("-");
		sb.append(raw.substring(20));

		return sb.toString();
	}

	public String getRadom(int limited) {
		String raw = this.valueAfterMD5.toUpperCase();
		StringBuffer sb = new StringBuffer(64);
		sb.append(raw.substring(8, 8 + limited));
		return sb.toString();
	}

	public static void main(String[] args) {
//		for (int i = 0; i < 100; i++) {
//			RadomUtils myGUID = new RadomUtils();
//			System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
//			System.out.println("rawGUID=" + myGUID.valueAfterMD5);
//			System.out.println("RandomGUID=" + myGUID.toString());
//			System.out.println("6=" + myGUID.getRadom(6));
//			System.out.println("4=" + myGUID.getRadom(4));
//		}
		System.out.println(autoAddPlus());
		
	}
	
    /**
     * 返回一个定长的随机纯字母字符串(只包含大小写字母)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateMixString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(allChar.charAt(random.nextInt(letterChar.length())));
        }
        return sb.toString();
    }
    
    public static String autoAddPlus(){
    	i++;
		String s = "000"+i; 
		return s.substring(s.length()-4);
    }
    
}
